#!/bin/bash

# 雷达系统服务后台启动脚本
# 作者: AI Assistant
# 日期: $(date +%Y-%m-%d)

set -e

# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color

# 日志函数
log_info() {
    echo -e "${GREEN}[INFO]${NC} $1"
}

log_warn() {
    echo -e "${YELLOW}[WARN]${NC} $1"
}

log_error() {
    echo -e "${RED}[ERROR]${NC} $1"
}

log_step() {
    echo -e "${BLUE}[STEP]${NC} $1"
}

# 工作目录
WORK_DIR="/home/admin1/lidar"
BACKEND_DIR="$WORK_DIR/lidar-master"
FRONTEND_DIR="$WORK_DIR/sb-data-view-main"

# PID文件目录
PID_DIR="$WORK_DIR/pids"
mkdir -p "$PID_DIR"

# 日志目录
LOG_DIR="$WORK_DIR/logs"
mkdir -p "$LOG_DIR"

# 检查端口是否被占用
check_port() {
    local port=$1
    if netstat -tlnp | grep ":$port " > /dev/null; then
        return 0  # 端口被占用
    else
        return 1  # 端口空闲
    fi
}

# 停止服务
stop_service() {
    local service_name=$1
    local pid_file="$PID_DIR/${service_name}.pid"

    if [ -f "$pid_file" ]; then
        local pid=$(cat "$pid_file")
        if kill -0 "$pid" 2>/dev/null; then
            log_info "停止 $service_name 服务 (PID: $pid)"
            kill "$pid"
            sleep 2
            if kill -0 "$pid" 2>/dev/null; then
                log_warn "强制停止 $service_name 服务"
                kill -9 "$pid"
            fi
        fi
        rm -f "$pid_file"
    fi
}

# 停止所有服务
stop_all_services() {
    log_step "停止所有服务..."

    # 停止监控守护进程
    stop_service "watchdog"

    # 停止后端服务
    stop_service "backend"

    # 强制停止Java进程
    pkill -f "java.*demo-test" || true

    # 清理监控脚本
    rm -f "$WORK_DIR/watchdog.sh"

    log_info "所有服务已停止"
}

# 启动后端服务
start_backend() {
    log_step "启动后端服务..."

    # 检查端口5000
    if check_port 5000; then
        log_warn "端口5000已被占用，尝试停止现有服务"
        pkill -f "java.*demo-test" || true
        sleep 3
    fi

    # 检查端口7100
    if check_port 7100; then
        log_warn "端口7100已被占用，尝试停止现有服务"
        pkill -f "java.*demo-test" || true
        sleep 3
    fi

    cd "$BACKEND_DIR"

    # 使用nohup后台启动Maven Spring Boot应用
    log_info "启动Spring Boot后端服务..."
    nohup mvn spring-boot:run > "$LOG_DIR/backend.log" 2>&1 &
    local backend_pid=$!
    echo "$backend_pid" > "$PID_DIR/backend.pid"

    log_info "后端服务已启动 (PID: $backend_pid)"
    log_info "后端日志: $LOG_DIR/backend.log"

    # 等待服务启动
    log_info "等待后端服务启动..."
    local count=0
    while [ $count -lt 60 ]; do
        if check_port 5000 && check_port 7100; then
            log_info "后端服务启动成功！"
            log_info "  - HTTP服务: http://192.168.15.125:5000"
            log_info "  - Netty服务: 192.168.15.125:7100"
            return 0
        fi
        sleep 2
        count=$((count + 1))
        echo -n "."
    done

    log_error "后端服务启动超时"
    return 1
}

# 启动守护进程监控服务
start_watchdog() {
    log_step "启动服务监控守护进程..."

    # 创建监控脚本
    cat > "$WORK_DIR/watchdog.sh" << 'EOF'
#!/bin/bash

# 服务监控守护进程
WORK_DIR="/home/admin1/lidar"
PID_DIR="$WORK_DIR/pids"
LOG_DIR="$WORK_DIR/logs"

# 检查端口是否被占用
check_port() {
    local port=$1
    if netstat -tlnp | grep ":$port " > /dev/null 2>&1; then
        return 0  # 端口被占用
    else
        return 1  # 端口空闲
    fi
}

# 重启后端服务
restart_backend() {
    echo "$(date): 检测到后端服务异常，正在重启..." >> "$LOG_DIR/watchdog.log"

    # 停止现有服务
    pkill -f "java.*demo-test" || true
    sleep 5

    # 重新启动
    cd "$WORK_DIR"
    ./start_services.sh start >> "$LOG_DIR/watchdog.log" 2>&1

    echo "$(date): 后端服务重启完成" >> "$LOG_DIR/watchdog.log"
}

# 主监控循环
while true; do
    # 检查后端服务
    if ! check_port 5000 || ! check_port 7100; then
        echo "$(date): 后端服务异常，端口5000或7100未响应" >> "$LOG_DIR/watchdog.log"
        restart_backend
    fi

    # 每30秒检查一次
    sleep 30
done
EOF

    chmod +x "$WORK_DIR/watchdog.sh"

    # 启动监控守护进程
    nohup "$WORK_DIR/watchdog.sh" > "$LOG_DIR/watchdog.log" 2>&1 &
    local watchdog_pid=$!
    echo "$watchdog_pid" > "$PID_DIR/watchdog.pid"

    log_info "监控守护进程已启动 (PID: $watchdog_pid)"
    log_info "监控日志: $LOG_DIR/watchdog.log"
}

# 启动前端服务 (如果需要独立前端)
start_frontend() {
    log_step "检查独立前端服务..."
    
    # 检查是否已有Python前端服务在运行
    if check_port 8080; then
        log_info "独立前端服务已在端口8080运行"
        return 0
    fi
    
    # 如果需要启动独立前端服务，可以在这里添加
    log_info "独立前端服务未运行，但后端已包含前端静态文件"
}

# 显示服务状态
show_status() {
    log_step "服务状态检查..."
    
    echo ""
    echo "=== 服务运行状态 ==="
    
    # 检查后端服务
    if check_port 5000; then
        log_info "✅ 后端HTTP服务: http://192.168.15.125:5000 (运行中)"
    else
        log_error "❌ 后端HTTP服务: 端口5000 (未运行)"
    fi
    
    if check_port 7100; then
        log_info "✅ Netty通信服务: 192.168.15.125:7100 (运行中)"
    else
        log_error "❌ Netty通信服务: 端口7100 (未运行)"
    fi
    
    # 检查独立前端服务
    if check_port 8080; then
        log_info "✅ 独立前端服务: http://192.168.15.125:8080 (运行中)"
    else
        log_warn "⚠️  独立前端服务: 端口8080 (未运行)"
    fi
    
    echo ""
    echo "=== 访问地址 ==="
    echo "🌐 主要前端界面: http://192.168.15.125:5000"
    echo "🌐 备用前端界面: http://192.168.15.125:8080"
    echo "📡 API接口地址: http://192.168.15.125:5000/test"
    echo ""
    
    echo "=== 进程信息 ==="
    if [ -f "$PID_DIR/backend.pid" ]; then
        local pid=$(cat "$PID_DIR/backend.pid")
        if kill -0 "$pid" 2>/dev/null; then
            echo "后端服务 PID: $pid"
        fi
    fi
    
    echo ""
    echo "=== 日志文件 ==="
    echo "后端日志: $LOG_DIR/backend.log"
    echo "查看实时日志: tail -f $LOG_DIR/backend.log"
}

# 主函数
main() {
    log_info "雷达系统服务后台启动脚本"
    log_info "工作目录: $WORK_DIR"
    
    case "${1:-start}" in
        "start")
            start_backend
            start_watchdog
            start_frontend
            show_status
            ;;
        "stop")
            stop_all_services
            ;;
        "restart")
            log_step "重启所有服务..."
            stop_all_services
            sleep 3
            start_backend
            start_watchdog
            start_frontend
            show_status
            ;;
        "status")
            show_status
            ;;
        *)
            echo "用法: $0 {start|stop|restart|status}"
            echo ""
            echo "命令说明:"
            echo "  start   - 启动所有服务"
            echo "  stop    - 停止所有服务"
            echo "  restart - 重启所有服务"
            echo "  status  - 查看服务状态"
            exit 1
            ;;
    esac
}

# 执行主函数
main "$@"
